package com.goa.parse;

import java.util.Arrays;

public class HexStringToByteArray {
  
    /**  
     * 将16进制的字符串表示转换成字节数组。
     *   
     * @param hexString 16进制的字符串，可以包含大写或小写的'A'-'F'以及数字'0'-'9'。  
     * @return 对应的字节数组。  
     * @throws IllegalArgumentException 如果输入的字符串长度不是偶数。  
     */  
    public static byte[] hexStringToByteArray(String hexString) {  
        // 检查字符串长度是否为偶数  
        if (hexString.length() % 2 != 0) {  
            throw new IllegalArgumentException("Hex string must have an even length");  
        }  
  
        // 初始化字节数组，长度为字符串长度的一半  
        byte[] bytes = new byte[hexString.length() / 2];  
  
        // 遍历字符串，每次处理两个字符  
        for (int i = 0; i < bytes.length; i++) {  
            // 将两个十六进制字符转换成对应的字节  
            // 注意：由于字符是ASCII编码的，所以'0'的ASCII码是48，'A'的ASCII码是65（'a'是97）  
            // 我们需要减去这些值来得到实际的数字值，然后组合成字节  
            int index = i * 2;  
            int value = Integer.parseInt(hexString.substring(index, index + 2), 16);  
            bytes[i] = (byte) value;  
        }  
  
        // 返回转换后的字节数组  
        return bytes;  
    }  
  
    public static void main(String[] args) {
        //bytes = [-50, -46, -80, -82, -60, -29, 49, 49, 49]
        String hexString = "ced2b0aec4e3313131"; // "John" 的十六进制表示
        try {  
            byte[] bytes = hexStringToByteArray(hexString);
            System.out.println("bytes = " + Arrays.toString(bytes));
            // 打印字节数组，这里只是为了验证，实际使用中可能不需要这样做  
            for (byte b : bytes) {  
                System.out.printf("%02X ", b);  
            }  
            // 或者，如果你想将字节数组转换回字符串，可以这样做  
//             String originalString = new String(bytes, StandardCharsets.UTF_8);
//             System.out.println(originalString); // 输出: John
        } catch (IllegalArgumentException e) {  
            System.err.println(e.getMessage());  
        }  
    }  
}